class Evaluacion < ActiveRecord::Base
  include ActionController::UrlWriter
  has_many :usuarios
  has_many :preguntas, :dependent => :destroy,:order=>"preguntas.cargo_id, preguntas.competencia_tipo,preguntas.competencia_nombre,preguntas.texto"
  has_many :evaluados, :dependent => :destroy,:order=>"usuario_id"
  has_many  :resultados_competencias, :dependent => :destroy
  validates_presence_of :nombre
  validates_uniqueness_of :nombre

  after_update :save_preguntas

  def estado
    self.terminada? ? "Terminada" : "Incompleta"
  end

  def nombre_para_archivo
    self.nombre.downcase.gsub(/[\\\/]/,'-').gsub(' ', '_')
  end

  def new_pregunta_attributes=(pregunta_attributes)
    pregunta_attributes.each do |attributes|
      preguntas.build(attributes) #unless attributes.values.any?(&:blank?)
    end
  end

  def existing_pregunta_attributes=(pregunta_attributes)
    preguntas.reject(&:new_record?).each do |pregunta|
      attributes = pregunta_attributes[pregunta.id.to_s]
      if attributes
        pregunta.attributes = attributes
      else
        pregunta.destroy
      end
    end
  end

  def save_preguntas
    preguntas.each do |pregunta|
      pregunta.save
      pregunta.save_opciones
    end
  end

  def completar_evaluacion(evaluado, usuario)
    num_preguntas  =  evaluado.evaluado.preguntas.por_evaluacion(self).count
    num_respuestas =  usuario.respuestas.por_evaluacion_y_evaluado(self,evaluado.evaluado).count
    usuario_preguntas=evaluado.evaluado.usuarios_preguntas.por_evaluacion(self)
    j=0
    usuario_preguntas.each_with_index do |up,j|
      up.resultado=up.usuario.porcentaje_por_pregunta(up.pregunta).round(2)
      up.save
    end

    evaluado.evaluado.asignar_resultado_por_competencia(self)

    if (num_respuestas == num_preguntas) && (num_respuestas != 0 && num_preguntas != 0)
      evaluado.update_attribute(:estado, 'completa') if evaluado && evaluado.estado == 'incompleta'
    end
  end

  def num_respuestas(usuario_evaluado, usuario)
    num_respuestas = []
    self.preguntas.competencias_cargo(usuario_evaluado.cargo_id).each do |pregunta|
      pregunta.respuestas.evaluado(usuario_evaluado.id).evaluador(usuario.id).each do |respuesta|
        num_respuestas << respuesta.valor if respuesta.valor
      end
    end
    num_respuestas.size
  end

  def borrar_respuestas(usuario, usuario_evaluado)
    preguntas.each do |pregunta|
      respuesta = pregunta.respuestas.find(:first, :conditions => ['usuario_id = ? AND evaluado_id = ?', usuario.id, usuario_evaluado.id])
      resp = respuesta.destroy if respuesta
      resp
    end
  end

  def strf_fecha
    fecha ? fecha.strftime("%d/%m/%Y") : '-'
  end  

  def self.duplicar(id)
    eva_original=Evaluacion.find(id)
    eva_copia=eva_original.clone
    eva_copia.nombre+=" - COPIA"
    eva_copia.save
    eva_original.preguntas.each do |p_original|
      p_copia=p_original.clone
      p_copia.evaluacion=eva_copia
      p_copia.save
      p_original.opciones.each do |o_original|
        o_copia=o_original.clone
        o_copia.pregunta=p_copia
        o_copia.save
      end
    end
    eva_copia.terminada=false
    eva_copia
  end

  def link_reporte(tipo)
    img="<img src='/bitacorh/images/excel.png' class='icono' alt='Excel'>"
    link="<a href=#{reporte_evaluaciones_path(:id=>self,:tipo=>tipo.to_s)}>#{img}Descargar</a>"
    link
  end

  def reporte(tipo)
    self.send(tipo)
  end

  def tipo_evaluador(tipo, evaluado_id, evaluador_id)
    case tipo
    when "subordinado"
      "superior"
    when "superior"
      "subordinado"
    else
      if evaluado_id == evaluador_id
        "autoevaluacion"
      else
        "par"
      end
    end
  end
  
  def clear(text)
    text.gsub("\r",'').gsub("\n",'')
  end
  private

  def completo
    csv_string = FasterCSV.generate(:encoding=>'U') do |csv|
      csv<<['fecha_de_evaluacion','mes','anio',
        'evaluador', 'cargo_evaluador', 'filial_evaluador', 'area_evaluador',
        'evaluado', 'cargo_evaluado', 'filial_evaluado', 'area_evaluado',
        'evaluado_por', 'descripción_de_competencias_pregunta',
        'calificacion', 'calif_o_valor', 'valor_max', 'comentarios',
        'tipo_de_competencia', 'competencia']
      self.evaluados.each do |evaluado|
        usuario_evaluado = evaluado.usuario_evaluado
        usuario_evaluado_datos        = usuario_evaluado.datos.por_evaluacion(self).first
        evaluador        = evaluado.usuario
        evaluador_datos        = evaluador.datos.por_evaluacion(self).first
        preguntas        = usuario_evaluado.preguntas.por_evaluacion(self)
        preguntas.each do |pregunta|
          respuesta = pregunta.respuestas.evaluado(usuario_evaluado.id).evaluador(evaluador.id).first
          if respuesta
            pregunta_opcion = pregunta.opciones.find(:first, :conditions => ['valor = ?', respuesta.valor])
            csv << [self.strf_fecha,
              self.fecha ? self.fecha.strftime("%B") : '-',
              self.fecha ? self.fecha.year : '-',
              evaluador.nombre || '-',
              evaluador_datos.try(:cargo),
              evaluador_datos.try(:filial),
              evaluador_datos.try(:area),
              (usuario_evaluado && usuario_evaluado.nombre) ? usuario_evaluado.nombre : '-',
              usuario_evaluado_datos.try(:cargo),
              usuario_evaluado_datos.try(:filial),
              usuario_evaluado_datos.try(:area),
              respuesta.tipo_evaluador ? respuesta.tipo_evaluador : '-',
              pregunta.texto ? self.clear(pregunta.texto) : '-',
              (pregunta_opcion && pregunta_opcion.texto) ? self.clear(pregunta_opcion.texto) : '-',
              respuesta.valor ? respuesta.valor.to_s.gsub('.',',') : '0.0',
              pregunta.maxima_opcion ? pregunta.maxima_opcion.to_s.gsub('.',',') : '0.0',
              respuesta.comentario ? self.clear(respuesta.comentario) : '-',
              pregunta.competencia_tipo,
              pregunta.competencia_nombre]
          end
        end
      end
    end
    csv_string
  end

  def totalizado
    csv_string = FasterCSV.generate(:encoding=>'U') do |csv|
      csv<<['fecha','mes','año',
        'evaluador', 'cargo evaluador', 'filial evaluador', 'area evaluador',
        'evaluado','cargo evaluado', 'filial evaluado','area evaluado',
        'evaluado por', 'competencia', 'puntaje']
      self.evaluados.each do |evaluado|
        usuario_evaluado = evaluado.usuario_evaluado # evaluado
        usuario_evaluado_datos        = usuario_evaluado.datos.por_evaluacion(self).first
        tipo_evaluador   = tipo_evaluador(evaluado.tipo, usuario_evaluado.id, evaluado.usuario.id)
        evaluador_datos        = evaluado.usuario.datos.por_evaluacion(self).first
        
        #total_general    = "%.2f" % usuario_evaluado.resultado_tipo_competencia(:generales,self)
        #total_especifica = "%.2f" % usuario_evaluado.resultado_tipo_competencia(:especificas,self)

        total_general    = "%.2f" % usuario_evaluado.resultado_competencias_por_evaluador(self,:general, evaluado.usuario)
        total_especifica = "%.2f" % usuario_evaluado.resultado_competencias_por_evaluador(self,:especifica, evaluado.usuario)

        if total_especifica != 0
          csv<<[self.strf_fecha,
            self.fecha.strftime("%B"),
            self.fecha.year,
            evaluado.usuario.nombre,
            evaluador_datos.cargo,
            evaluador_datos.filial,
            evaluador_datos.area,
            usuario_evaluado.try(:nombre),
            usuario_evaluado_datos.try(:cargo),
            usuario_evaluado_datos.try(:filial),
            usuario_evaluado_datos.try(:area),
            tipo_evaluador,
            "especifica",
            total_especifica.to_s.gsub('.', ',')]
        end
        if total_general != 0
          csv<<[self.strf_fecha,
            self.fecha.strftime("%B"),
            self.fecha.year,
            evaluado.usuario.nombre,
            evaluador_datos.try(:cargo),
            evaluador_datos.try(:filial),
            evaluador_datos.try(:area),
            usuario_evaluado.nombre,
            usuario_evaluado_datos.try(:cargo),
            usuario_evaluado_datos.try(:filial),
            usuario_evaluado_datos.try(:area),
            tipo_evaluador,
            "general",
            total_general.to_s.gsub('.', ',')]
        end
      end
    end
    csv_string
  end
end

